<?php
namespace app\index\controller;

use think\Db;
use think\db\Query;

/**
 * 数据库 > 查询构造器
 */
class G
{
    /**
     * 查询数据
     */

    // 基本查询
    public function index()
    {
        // 查询一个数据
        $info = Db::table('ot_member')->where('uid', 1)->find();

        // 查询数据集
        $list = Db::table('ot_member')->where('status', 1)->select();

        // 设置了表前缀
        $info = Db::name('member')->where('uid', 1)->find();
        $list = Db::name('member')->where('status', 1)->select();
    }

    // 助手函数
    public function a()
    {
        $info = db('member')->where('uid', 1)->find();
        $list = db('member')->where('status', 1)->select();

        // 使用db助手函数默认每次都会重新连接数据库，
        // 而使用Db::name或者Db::table方法的话都是单例的。
        // db函数如果需要采用相同的链接，可以传入第三个参数，例如
        $info = db('member', [], false)->where('uid', 1)->find();
        $list = db('member', [], false)->where('status', 1)->select();
    }

    // 使用Query或闭包查询
    public function b()
    {
        // 使用查询对象进行查询
        $Query = new Query();
        $Query->table('ot_member')->where('status', 1);
//        $Query->name('member')->where('status', 1);

        $info = Db::find($Query);
//        $Query->table('ot_member')->where('status', 1);
        $list = Db::select($Query);

        // 直接使用闭包函数查询
        $list = Db::select(function($Query){
            $Query->table('ot_member')->where('status', 1);
        });
    }

    // 值和列查询
    public function c()
    {
        // 查询某个字段的值
        $name = Db::table('ot_member')->where('uid', 5)->value('username');

        // 查询某一列的值可以用
        // 返回数组
        $names = Db::table('ot_member')->where('status', 1)->column('username');
        // 指定索引
        $ns = Db::table('ot_member')->where('status', 1)->column('username', 'uid');
    }

    // 数据集分批处理
    public function d()
    {
        Db::table('ot_member')->chunk(10, function($users){
            foreach($users as $user)
            {
                echo $user['username'].'<br/>';
            }
        });
    }

    // JSON类型数据查询（mysql V5.0.1）
    public function e()
    {
        $info = Db::table('ot_member')->where('email$.email', 'lyz@126.com')->find();
//        dump($info);
    }


    /**
     * 添加数据
     */

    // 添加一条数据
    public function f()
    {
//        $data = array('username'=>'小美', 'password'=>'1231231', 'email'=>'lyz@126.com');
        $data = ['username'=>'小美', 'password'=>'1231231', 'email'=>'lyz@126.com'];
        $re = Db::table('ot_user')->insert($data);
        Db::name('user')->insert($data);
        // 获取自增ID
        $userId = Db::name('user')->getLastInsID();
        // 直接使用insertGetId方法新增数据并返回主键值
        $userId = Db::name('user')->insertGetId($data);

        // 助手函数
        db('user')->insert($data);
    }

    // 添加多条数据
    public function g()
    {
        $data = [
            ['username'=>'小代', 'password'=>'1', 'email'=>'lyz@126.com'],
            ['username'=>'小美', 'password'=>'2', 'email'=>'lyz@126.com'],
            ['username'=>'小进', 'password'=>'3', 'email'=>'lyz@126.com'],
        ];
        $re = Db::name('user')->insertAll($data);

        // 助手函数
        db('user')->insertAll($data);
    }

    // 快捷更新
    public function h()
    {
        // V5.0.5+以上版本封装的快捷更新方法data，可以配合insert使用
        Db::table('ot_user')->data(['mobile'=>'13752645985'])->insert();
    }


    /**
     * 更新数据
     */

    // 更新数据表中的数据
    public function i()
    {
        $data = ['username'=>'小凤'];     // 数组
        $re = Db::table('ot_user')->where('id', 22)->update($data);

        // 如果数据中包含主键，可以直接使用
        $data = array('username'=>'小军', 'id'=>23);
        $re = Db::table('ot_user')->update($data);
//        dump($re);

        // 如果要更新的数据需要使用SQL函数或者其它字段，可以使用下面的方式
        Db::table('ot_user')
            ->where('id', 23)
            ->update([
                'create_time' => ['exp', 'now()'],
                'status' => ['exp', 'status+1'],
            ]);
//        echo Db::table('ot_user')->getLastSql();
    }

    // 更新某个字段的值
    public function j()
    {
        $re = Db::table('ot_user')->where('id', 23)->setField('email', 'fd2014lyz@126.com');
        dump($re);
        echo Db::table('ot_user')->getLastSql();
    }

    // 自增或自减一个字段的值
    public function k()
    {
        // status 字段加 1
        Db::table('ot_user')->where('id', 23)->setInc('status');

        // status 字段加 5
        Db::table('ot_user')->where('id', 23)->setInc('status', 5);

        // status 字段减 1
        Db::table('ot_user')->where('id', 23)->setDec('status');

        // status 字段减 5
        Db::table('ot_user')->where('id', 23)->setDec('status', 6);
    }

    // 延迟更新
    public function l()
    {
        // setInc/setDec支持延时更新，如果需要延时更新则传入第三个参数
        // 延迟 10秒
        Db::table('ot_user')->where('id', 23)->setInc('status', 1, 10);
//        echo Db::table('ot_user')->getLastSql();
//        echo '<br/>';
        Db::table('ot_user')->where('id', 23)->setDec('status', 2, 10);
//        echo Db::table('ot_user')->getLastSql();
    }


    /**
     * 删除数据
     */

    // 删除数据表中的数据
    public function m()
    {
        // 根据主键删除
        Db::table('ot_user')->delete(5);
        Db::table('ot_user')->delete([6, 7, 8]);

        // 条件删除
        Db::table('ot_user')->where('id', 9)->delete();
        Db::table('ot_user')->where('id', '>', 9)->delete();
    }

    // 助手函数
    public function n()
    {
        // 根据主键删除
        db('user')->delete(5);

        // 条件删除
        db('user')->where('id', 6)->delete();
    }


    /**
     * 查询方法
     */

    // 条件查询方法
    public function o()
    {
        // 使用where方法进行AND条件查询
        $info = Db::table('ot_user')
            ->where('username', 'like', '小%')
            ->where('status', 1)
            ->find();

//        echo Db::table('ot_user')->getLastSql();

        // 使用whereOr方法进行OR查询
        $info = Db::table('ot_user')
            ->where('username', 'like', '小%')
            ->whereOr('email', 'like', '%@126.com')
            ->find();

//        echo Db::table('ot_user')->getLastSql();

        // 多字段相同条件的OR查询可以简化为如下方式
        $info = Db::table('ot_user')
            ->where('username|email', 'like', '小%')
            ->find();

//        echo Db::table('ot_user')->getLastSql();
    }

    // 混合查询
    public function p()
    {
        // where方法和whereOr方法在复杂的查询条件中经常需要配合一起混合使用
        $result = Db::table('ot_user')->where(function($query){
            $query->where('id', 1)->whereOr('id', 2);
        })->whereOr(function($query){
            $query->where('username', 'like', '小%')->whereOr('email', 'like', '%@126.com');
        })->select();

//        $result = Db::table('ot_user')->where(function($query){
//            $query->where('id', 1)->whereOr('id', 2);
//        })->whereOr(function($query){
//            $query->where('username', 'like', '小%')->whereOr('email', 'like', '%@126.com');
//        })->where(function($query){
//            $query->where('id', 3)->whereOr('id', 4);
//        })->whereOr(function($query){
//            $query->where('username', 'like', '%小')->whereOr('email', 'like', 'l%');
//        })->select();

        echo Db::table('ot_user')->getLastSql();
    }

    // getTableInfo方法
    public function q()
    {
        // 获取`ot_user`表所有信息
        $info = Db::getTableInfo('ot_user');
        // 获取`ot_user`表所有字段
        Db::getTableInfo('ot_user', 'fields');
        // 获取`ot_user`表所有字段的类型
        Db::getTableInfo('ot_user', 'type');
        // 获取`ot_user`表的主键
        Db::getTableInfo('ot_user', 'pk');
        dump($info);
    }


    /**
     * 查询语法
     */


    /**
     * 链式操作
     */

    // join
    public function r()
    {

    }

    // union 合并两个或多个select语句的结果集
    public function s()
    {
        $names = Db::field('username')
            ->table('ot_member')
            ->union('select username from ot_user')
            ->union('select username from tdc_manager')
            ->select();

        // 闭包用法
        $names_ = Db::field('username')
            ->table('ot_member')
            ->union(function($query){
                    $query->field('username')->table('ot_user');
                })
            ->union(function($query){
                    $query->field('username')->table('tdc_manager');
                })
            ->select();

//        dump($names_);
    }

    // partition 方法用于是数据库水平分表
    public function t()
    {
        /**
         * partition($data, $field, $rule);
         *      $data 分表字段的数据
         *      $field 分表字段的名称
         *      $rule 分表规则
         */

        // 用于写入
        $data = [
            'id' => 5,
            'username' => '小军'
        ];

        // 分表规则
        $rule = [
            'type' => 'mod',    // 分表方式
            'num' => 2,          // 分表数量
        ];

        Db::name('user')
            ->partition(['id'=>6], 'id', $rule)
            ->insert($data);
    }


    /**
     * 视图查询
     */

    public function u()
    {

    }


}
